/**
 * Notes: 工具控制器 
 * Date: 2023-12-25 
 */

const BaseProjectController = require('./base_project_controller.js');
const cloudBase = require('../../../framework/cloud/cloud_base.js');
const timeUtil = require('../../../framework/helpers/time_util.js');
const dataUtil = require('../../../framework/helpers/data_util.js');
const dbUtil = require('../../../framework/database/db_util.js');
const appCode = require('../../../framework/core/app_code.js');

class UtilController extends BaseProjectController {

    /**
     * 批量请求处理
     * 参数: requests - 请求数组，每个元素包含 route, params
     * 返回: results - 结果数组，与请求数组对应
     */
    async batchRequest() {
        // 获取并校验请求参数
        let input = this.validateData({
            requests: 'array|name=请求数组',
        });

        const requests = input.requests || [];
        if (requests.length === 0) {
            return this.createError('请求数组不能为空');
        }

        // 限制最大请求数量，防止滥用
        if (requests.length > 10) {
            return this.createError('批量请求数量超过限制');
        }

        // 获取用户ID
        const userId = this._userId;
        if (!userId) {
            return this.createError('用户未登录');
        }

        try {
            // 创建结果数组
            const results = [];

            // 处理每个请求
            for (const req of requests) {
                try {
                    const { route, params } = req;

                    // 验证路由格式
                    if (!route || typeof route !== 'string') {
                        results.push({ success: false, error: '无效的路由' });
                        continue;
                    }

                    // 解析路由 (格式: controller/action)
                    const [controllerName, actionName] = route.split('/');
                    if (!controllerName || !actionName) {
                        results.push({ success: false, error: '无效的路由格式' });
                        continue;
                    }

                    let Controller;
                    try {
                        Controller = require(`./${controllerName}_controller.js`);
                    } catch (e) {
                        console.error('加载控制器失败:', e);
                        results.push({ success: false, error: '控制器不存在' });
                        continue;
                    }

                    // 创建控制器实例
                    const controller = new Controller();

                    // 设置控制器上下文
                    controller._request = this._request;
                    controller._cloud = this._cloud;
                    controller._userId = this._userId;
                    controller._admin = this._admin;
                    controller._adminId = this._adminId;
                    controller._appId = this._appId;

                    // 手动设置参数
                    if (params && typeof params === 'object') {
                        controller._params = params;
                    }

                    // 检查方法是否存在
                    if (typeof controller[actionName] !== 'function') {
                        results.push({ success: false, error: '方法不存在' });
                        continue;
                    }

                    // 调用方法
                    const result = await controller[actionName]();

                    // 添加结果
                    if (result && result.code === 0) {
                        // 成功的请求
                        results.push({ 
                            success: true, 
                            data: result.data 
                        });
                    } else {
                        // 失败的请求
                        results.push({ 
                            success: false, 
                            error: result.msg || '请求失败' 
                        });
                    }
                } catch (err) {
                    console.error('处理单个请求失败:', err);
                    results.push({ 
                        success: false, 
                        error: err.message || '处理请求失败' 
                    });
                }
            }

            // 直接返回结果数组，不要包装在 data 字段中
            return results;
        } catch (err) {
            console.error('批量请求处理失败:', err);
            return this.createError('批量请求处理失败');
        }
    }
}

module.exports = UtilController; 